///////////////////////////////////////////////////////////////////////////////
// This file is part of the chustd library
// Copyright (C) ChuTeam
// For conditions of distribution and use, see copyright notice in chustd.h
///////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Atomic.h"

namespace chustd {\

///////////////////////////////////////////////////////////////////////////////
// Increments an integer as an atomic operation
///////////////////////////////////////////////////////////////////////////////
int32 Atomic::Increment(int32* pVal)
{
#if defined(_WIN32)
	return ::InterlockedIncrement((LONG*)pVal);
#elif defined(__GNUC__)
	return __sync_fetch_and_add(pVal, 1);
#endif
}

///////////////////////////////////////////////////////////////////////////////
// Increments an integer as an atomic operation
///////////////////////////////////////////////////////////////////////////////
int32 Atomic::Decrement(int32* pVal)
{
#if defined(_WIN32)
	return ::InterlockedDecrement((LONG*)pVal);
#elif defined(__GNUC__)
	return __sync_fetch_and_sub(pVal, 1);
#endif
}

///////////////////////////////////////////////////////////////////////////////
}
